Lambda+SQS 構成での可視性タイムアウトに気を付けよう!
こんにちは、稲葉です。
最近、Lambda+SQS 構成での開発で可視性タイムアウトの設定で躓いた箇所があった為、
その共有と対処法について、今回記事にしたいと思います。
躓いた箇所
Lambda+SQSで構成して、SQSからのメッセージをトリガーにしてLambdaを実行していました。このLambdaは最大4回ループ、また1回の処理でも比較的時間がかかる処理を行います。
実際に動かしてみた所、処理が完了したはずなのに再実行されるといった意図しない動作をしました。そのため、まずはLambdaのログを確認。しかし、ログを確認した所、エラーは発生しておらず正常に動作してました。
となると、問題があるのはSQS の設定だと考え、色々調べた結果。遂に、原因を突き止めました!
ズバリ、可視性タイムアウトの設定が原因でした!
と言うより、可視性タイムアウトは特に設定していなかったため、デフォルトの30秒だった事が原因でした。
これが原因で、Lambdaの処理が完了する前に、可視性タイムアウトが解除されて、メッセージが見える状態になりそのメッセージを並列で他のLambdaが処理を行うという事が起きたため、意図しない動作になっていました。
対処法
結論、処理が長くなると思われるLambda(30秒を超える)と組み合わせてSQSを使用する際は、長めに可視性タイムアウトを設定する事が今回の問題の対処法になります。
具体的にどのぐらいの時間を設定するのが良いかと言いますと、Lambdaのランタイムの少なくとも6倍の時間を可視性タイムアウトの時間にするのが公式ドキュメントで推奨されています。(公式ドキュメント:Amazon SQS での Lambda の使用)
ちなみに、可視性タイムアウトの設定時間は、デフォルト:30秒。最小:0秒。最大:12時間です。
まとめ
今回は、「Lambda+SQS 構成での可視性タイムアウトに気を付けよう!」をテーマに躓き箇所と対処法について書きました。
今後もこのような問題に直面して、解決したら記事にしていきたいと思います。
最後まで、読んでくださり有難うございました!